#!/usr/bin/perl
use strict;

#données
my $dossier = $ARGV[0];
my $lot_test = 0;
my ($ligne, $mot, $cat, $lemme, $occur, @spr, $file, @dos, $compt, $dos_s, $file_d, @file, $fileres);
my $temp;
my %classif_lemme; #beta
my %compt_lemme; #occurences des lemmes par fichiers
my %compt_files_lemme; #occurences totales de lemmes par fichier
my %compt_classe_lemme; #occurences totales de lemmes par classe
my %etiquettes; #etiquettes
my %new_etiquettes; #nouvelles etiquettes calculées
my %nombre_docs; #nombre de documents, par classe et total
my %appartenances; #quels mots dans quels fichiers;
my %choix_alea; #découpage du corpus en lots
my $doc_ap = 0; #nombre de documents pour apprentissage
my $doc_test = 0; #nombre de documents pour test
my $epsilon = 0.000001; #variable de "lissage" (evitement des 0)
my $lot = 1; #lot test de départ

$nombre_docs{"0-star"} = 135;
$nombre_docs{"1-star"} = 283;
$nombre_docs{"2-star"} = 394;
$nombre_docs{"3-star"} = 173;
$nombre_docs{"unsupervised"} = 4021;
$nombre_docs{"total"} = $nombre_docs{"0-star"} + $nombre_docs{"1-star"} + $nombre_docs{"2-star"} + $nombre_docs{"3-star"};

#Lecture des dossiers
opendir(DIR, $dossier) || die "can't opendir $dossier: $!";
  @spr = grep { /^supervised$/ } readdir(DIR);
closedir DIR;

#Récupération des lots de docs via un fichier de lots
sub load_lots(){
	my $file = "lots_".$lot;
	open TT, $file or die "Cannot open $file\n";
	while($ligne = <TT>) {
		if($ligne=~ /^(.*)\t(.*)$/){
			my $fil = $1; my $lot = $2;
			$choix_alea{$fil} = $lot;
			if($lot == $lot_test){ $doc_test++;}
			else{ $doc_ap++;}
		}
	}
	print "Lots charges: $doc_ap docs apprentissage, $doc_test docs test\n";
}

#on récupère les documents étiquetés par les différents classifieurs
sub recup_new_etiquettes(){
	my $file = "new_etiquettes_hierarchique_2_lot_".$lot."_test_$lot_test";
	my $i=0;
	open TT, $file or die "Cannot open $file\n";
	while($ligne = <TT>) {
		if($ligne=~ /^(.*)\t(.*)$/){
			my $fil = $1; my $clas = $2;
			$new_etiquettes{$fil} = $clas;
			$i++;
		}
	}
	$file = "new_etiquettes_hierarchique_3_lot_".$lot."_test_$lot_test";
	$i=0;
	open TT, $file or die "Cannot open $file\n";
	while($ligne = <TT>) {
		if($ligne=~ /^(.*)\t(.*)$/){
			my $fil = $1; my $clas = $2;
			$new_etiquettes{$fil} = $clas;
			$i++;
		}
	}
	print "Fin recup: ".$i."\n";
}

#Récupération des differents etiquettes dans le corpus
sub classif_bayesien()
{
	my $tot3 = 0;
	print "Classif...\n";
	#parcours les dossiers
	foreach my $element (@spr){
		my $element2 = $dossier."/".$element;
		if($element2 eq $dossier."/supervised"){
	    		opendir(DIR, $element2) || die "can't opendir $element2: $!";
			print "Traitement de $element2 ...\n";
			@dos = grep { /star/ } readdir(DIR);
	    		closedir DIR;
		}
		else{ @dos = $element2; }
	
		foreach $dos_s (@dos){
			my $dos_s2 = $element2."/".$dos_s;
			opendir(DIR, $dos_s2) || die "can't opendir $dos_s2: $!";
			print "Traitement de $dos_s2 ...\n";
			@file = grep { /txt.lemme$/ } readdir(DIR);
			closedir DIR;
			
					
			# chaque fichier
			foreach $file_d (@file){
				my $file_d2 = $dos_s2."/".$file_d;
				
				#On récupère les etiquettes des documents supervisés
				if($file_d2 =~ /0-star/){
					$etiquettes{$file_d2} = "0-star";
				}
				if($file_d2 =~ /1-star/){
					$etiquettes{$file_d2} = "1-star";
				}
				if($file_d2 =~ /2-star/){
					$etiquettes{$file_d2} = "2-star";
				}
				if($file_d2 =~ /3-star/){
					$etiquettes{$file_d2} = "3-star";
				}
				
			}
		}
	}
}

sub evaluate(){
	#variable qui compte combien de documents sont bien ré-étiquetés
	
	
	my $good = 0;
	my $tot2 = 0;
	foreach my $el (keys(%etiquettes)){
		if($choix_alea{$el} == $lot_test){
			$tot2++;
			
			my $etiq;
			my $new_etiq;
			
			if($etiquettes{$el} =~ /([0-9])-star/){
				$etiq = $1;
			}

			if($new_etiquettes{$el} =~ /([0-9])-star/){
				$new_etiq = $1;
			}
			
			$good += exp( - abs( $etiq - $new_etiq  ));
		}
	}
	#on fait la moyenne
	$good /= $tot2;

	print "Reussite: ".$good."\n";
	print RES "$good\n";
}


######## Main #####################
classif_bayesien();

#on boucle sur les 10 différents lots de test possibles
while($lot<=10){
print "Lot $lot...\n";
$doc_ap = 0;
$doc_test = 0;
$lot_test = 0;
load_lots();

my $fileres = "Resultats_hierarchique_".$epsilon."_lot_".$lot;
open(RES, ">$fileres") or die "Can't open $fileres!\n";
while($lot_test<10){
	recup_new_etiquettes();
	evaluate();
	$lot_test++;
}
close(RES);
print "Fin lot $lot...\n";
$lot++;
}
